/*
指定起点的最短路径
date:20201228 am 12:10
key:
1.输入时a-b，b-a都要
2.统一循环内尽量只用一个变量一次
*/
#include<iostream>
#include<string>
#include<stack>
const int MAX = 1E9;
using namespace std;

int main()

{
	int N, M,i,j,k,l;
	cin >> N >> M;
	//N*N领阶矩阵创建,用N+1等于不要第0列和行
	int** mat = new int* [N];
	for (i = 0; i < N; i++)
	{
		mat[i]= new int [N];
	}
	//数值初始化
	for (i = 0; i < N ; i++)
	{
		for (j = 0; j < N ; j++)
		{
			mat[i][j] = MAX;
		}
	}
	//输入每条路的花费
	for (i = 0; i < M; i++)
	{
		cin >> j>>k>>l;
		mat[j-1][k-1] = l;
		//忘了这个反转术式了
		mat[k - 1][j - 1] = l;
	}
	//以0节点为起点
	int start = 2;

	//以0节点为起点的最短路径数组
	int* road = new int[N];
	for (i = 0; i < N; i++)//
	{
		road[i] = -1;
	}
	//以0节点为起点的最短距离存储数组
	int* min_cost = new int[N];
	for (i = 0; i < N; i++)//i只代表循环次数
	{
		if (mat[start][i] != MAX)
		{
			min_cost[i] = mat[start][i];
		}
		else
		{
			min_cost[i] = MAX;
		}
		

	}
	//标记数组
	bool* flag = new bool[N];
	for (i = 0; i < N; i++)//i只代表循环次数
	{
		flag[i] = false;
	}
	//图各节点是否联通的标记
	bool imposs=false;
	//从0节点开始的最短路径,只需要找n-1次
	for (i = 0; i < N; i++)//i只代表循环次数
	{
		
		road[i]=start;
		int now_cost = MAX;
		flag[start] = true;
		//对每个start到其余点花费的遍历
		for (j = 0; j < N; j++)
		{
			//这个点不能被访问过
			if (flag[j] == false)
			{
				if (mat[start][j] < now_cost)
				{
					//得到最小花费
					now_cost = mat[start][j];
					k = j;
				}
			}
		
		}

		//访问标记
		flag[start] = true;
		//最小花费更新花费数组

		if (min_cost[k] > min_cost[start] + now_cost)
		{
			min_cost[k] = MAX;
		}
		//在最小花费数组里找最小
		l = MAX;//这里一定要用新的变量
		for (j = 0; j < N; j++)
		{
			//这个点不能被访问过
			if (flag[j] == false)
			{
				if (min_cost[j] < l)
				{
					
					l = min_cost[j];
					start = j;
				}
			}

		}
		
	}
	
	//距离累计值,是否构不成联通图，检查标记数组。
	int res = 0;
	for (i = 0; i < N ; i++)
	{
		
		if (flag[i] == false)
		{
			imposs = true;
			break;
		};
	}
	if (imposs) 
	{
		cout << "Impossible";
	}
	else
	{
		for (i = 0; i < N - 1; i++)
		{

			res += mat[road[i]][road[i + 1]];
		}
		cout << res;
	}


}